﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Venta_Automatica.Models;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using System.Text;
using System.ServiceModel;


namespace Venta_Automatica.Controllers
{
    public class ClienteController : Controller
    {
        //
        // GET: /Cliente/

        List<RegistrarClienteModel> objCliente = new List<RegistrarClienteModel>();

        //[HttpPost]
        //public ActionResult ClienteReniec()
        //{

        //    //return View();
        //}

        
        public ActionResult RegistraCliente()
        {
            return View();
        }

        [HttpPost]
        public ActionResult MantCliente()
        {
            return View();
        }


        public ActionResult MantCliente(RegistrarClienteModel model)
        {
            List<ListarClienteModel> listaClientesModel;
            listaClientesModel = new List<ListarClienteModel>();
            try
            {
                HttpWebRequest req2 = (HttpWebRequest)WebRequest
                    .Create("http://localhost:24507/Clientes.svc/Clientes");
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string clientesJson2 = reader2.ReadToEnd();

                JavaScriptSerializer js2 = new JavaScriptSerializer();
                List<Cliente> clientesObtenidos = js2.Deserialize<List<Cliente>>(clientesJson2);

                ListarClienteModel clienteModel;
                

                foreach (var item in clientesObtenidos)
                {
                    clienteModel = new ListarClienteModel();
                    clienteModel.dni = item.dni;
                    clienteModel.Nombres = item.Nombre;
                    clienteModel.apeMat = item.apePat;
                    clienteModel.apePat = item.apeMat;
                    clienteModel.Tarjeta = item.tarjeta;
                    clienteModel.LineaCredito = item.lineaCredito;
                    listaClientesModel.Add(clienteModel);
                }
            }
            catch(WebException ex)
            {
                ViewData["Message"] = ex.Message.ToString();
                ModelState.AddModelError("", ex.Message.ToString());
            }
            return View(listaClientesModel);

        }

        [HttpPost]
        public ActionResult RegistraCliente(RegistrarClienteModel model)
        {
            if (!ModelState.IsValid) {
                ViewData["Message"] = "Los datos a registrar no son correctos, verifique e intente nuevamente.";
                return View();
            }

            try
            {

                string postdata = "{\"Dni\":" + model.dni + ",\"Nombre\":\"" + model.Nombres + "\",\"apePat\":\"" + model.apePat + "\",\"apeMat\":\"" + model.apeMat + "\",\"lineaCredito\":\"" + model.LineaCredito + "\"}"; //JSON
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                    .Create("http://localhost:24507/Clientes.svc/Clientes");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string clientesJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Cliente clientesCreado = js.Deserialize<Cliente>(clientesJson);
                if (clientesCreado.dni > 0)
                {
                    ViewData["Message"] = "Los Datos del Cliente " + model.dni + " se registraron Correctamente.";
                    return View();
                }
                else
                {
                    ViewData["Message"] = "Los datos ingresados no son correctos, verifique e intente nuevamente.";
                    ModelState.AddModelError("", "Los datos ingresados no son correctos, verifique e intente nuevamente.");
                }

                return View(model);

            }
            catch (WebException ex)
            {
                if (ex.Message.ToString() == "Error en el servidor remoto: (400) Solicitud incorrecta.")
                {
                    ViewData["Message"] = "Error, el DNI ingresado ya existe en la Base de Clientes.";
                }else{
                   ViewData["Message"] = ex.Message.ToString();
                }

                return View();
            }
        
        }

        public ActionResult EliminarCliente(int dni)
        {
            ListarClienteModel clienteModel = new ListarClienteModel();
            try
            {
                // Prueba de obtención de producto vía HTTP GET
                HttpWebRequest req2 = (HttpWebRequest)WebRequest
                    .Create("http://localhost:24507/Clientes.svc/Clientes/" + dni + "");
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string clientesJson2 = reader2.ReadToEnd();
                JavaScriptSerializer js2 = new JavaScriptSerializer();
                Cliente clientesObtenido = js2.Deserialize<Cliente>(clientesJson2);

                clienteModel.dni = clientesObtenido.dni;
                clienteModel.apeMat = clientesObtenido.apeMat;
                clienteModel.apePat = clientesObtenido.apePat;
                clienteModel.Nombres = clientesObtenido.Nombre;
                clienteModel.Tarjeta = clientesObtenido.tarjeta;
                clienteModel.LineaCredito = clientesObtenido.lineaCredito;
            }
            catch (WebException ex)
            {
                if (ex.Message.ToString() == "Error en el servidor remoto: (400) Solicitud incorrecta.")
                {
                    ViewData["Message"] = "Error, el DNI ingresado ya no existe en la Base de Clientes.";
                }
                else
                {
                    ViewData["Message"] = ex.Message.ToString();
                }
            }
            return View(clienteModel);
        }

        [HttpPost]
        public ActionResult EliminarCliente(ListarClienteModel model)
        {
                string postdata = "{\"Dni\":" + model.dni + ",\"Nombre\":\"" + model.Nombres + "\",\"apePat\":\"" + model.apePat + "\",\"apeMat\":\"" + model.apeMat + "\",\"lineaCredito\":\"" + model.LineaCredito + "\"}"; //JSON
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                    .Create("http://localhost:24507/Clientes.svc/Clientes");
                req.Method = "DELETE";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                ViewData["Message"] = "Los Datos del Cliente " + model.dni + " se eliminaron Correctamente.";
                //return RedirectToAction("MantCliente", "Cliente");
                return View();
            }

        [HttpPost]
        public ActionResult ModificarCliente(RegistrarClienteModel model)
        {

            if (!ModelState.IsValid)
            {
                ViewData["Message"] = "Los datos modificados no son correctos, verifique e intente nuevamente.";
                return View();
            }

            string postdata = "{\"Dni\":" + model.dni + ",\"Nombre\":\"" + model.Nombres + "\",\"apePat\":\"" + model.apePat + "\",\"apeMat\":\"" + model.apeMat + "\",\"tarjeta\":\"" + model.Tarjeta +  "\",\"lineaCredito\":\"" + Convert.ToInt32(model.LineaCredito) + "\"}"; //JSON
            byte[] data = Encoding.UTF8.GetBytes(postdata);
            HttpWebRequest req = (HttpWebRequest)WebRequest
                .Create("http://localhost:24507/Clientes.svc/Clientes");
            req.Method = "PUT";
            req.ContentLength = data.Length;
            req.ContentType = "application/json";
            var reqStream = req.GetRequestStream();
            reqStream.Write(data, 0, data.Length);
            var res = (HttpWebResponse)req.GetResponse();
            StreamReader reader = new StreamReader(res.GetResponseStream());
            string clientesJson = reader.ReadToEnd();
            JavaScriptSerializer js = new JavaScriptSerializer();
            Cliente clientesCreado = js.Deserialize<Cliente>(clientesJson);
            if (clientesCreado.dni > 0)
            {
                ViewData["Message"] = "Los Datos del Cliente " + model.dni + " se modificaron Correctamente.";
                return View();
            }
            else
            {
                ModelState.AddModelError("", "Los datos modificados no son correctos, verifique e intente nuevamente.");
            }

            return View();
        }

        public ActionResult ModificarCliente(int dni)
        {
            ListarClienteModel clienteModel = new ListarClienteModel(); ;
            // Prueba de obtención de producto vía HTTP GET
            HttpWebRequest req2 = (HttpWebRequest)WebRequest
                .Create("http://localhost:24507/Clientes.svc/Clientes/" + dni + "");
            req2.Method = "GET";
            HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
            StreamReader reader2 = new StreamReader(res2.GetResponseStream());
            string clientesJson2 = reader2.ReadToEnd();
            JavaScriptSerializer js2 = new JavaScriptSerializer();
            Cliente clientesObtenido = js2.Deserialize<Cliente>(clientesJson2);

            clienteModel.dni = clientesObtenido.dni;
            clienteModel.apeMat = clientesObtenido.apeMat;
            clienteModel.apePat = clientesObtenido.apePat;
            clienteModel.Nombres = clientesObtenido.Nombre;
            clienteModel.Tarjeta = clientesObtenido.tarjeta;
            clienteModel.LineaCredito = clientesObtenido.lineaCredito;
            
            return View(clienteModel);
        }


        public ActionResult ReniecKO()
        {
            return View();
        }
        public ActionResult ReniecOK()
        {
            return View();
        }

        public ActionResult PendienteMC()
        {
            List<ListarClienteModel> listaClientesModel = new List<ListarClienteModel>();
            try
            {
                // Prueba de obtención de producto vía HTTP GET
                HttpWebRequest req2 = (HttpWebRequest)WebRequest
                    .Create("http://localhost:1414/ClientesMCService.svc/ClientesMC");
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string clientesJson2 = reader2.ReadToEnd();
                JavaScriptSerializer js2 = new JavaScriptSerializer();
                List<ClienteMC> clientesObtenidos = js2.Deserialize<List<ClienteMC>>(clientesJson2);

                ListarClienteModel clienteModel;
                

                if (listaClientesModel.Count() > 0)
                {

                    foreach (var item in clientesObtenidos)
                    {
                        clienteModel = new ListarClienteModel();
                        clienteModel.dni = item.dni;
                        clienteModel.Nombres = item.nombre;
                        clienteModel.apeMat = item.apellidoMaterno;
                        clienteModel.apePat = item.apellidoPaterno;
                        clienteModel.LineaCredito = item.lineaCredito;
                        listaClientesModel.Add(clienteModel);
                    }
                }
                else
                {
                    listaClientesModel = null;
                }          
            }
            catch (WebException ex)
            {
                if (ex.Message.ToString() == "No es posible conectar con el servidor remoto")
                {
                    ViewData["Message"] = "Error, el servicio no se encuentra activo";
                }
                else
                {
                    ViewData["Message"] = ex.Message.ToString();
                }
            }
               
            return View(listaClientesModel);
        }



        public ActionResult RespuestaMC()
        {
            return View(objCliente);
        }
        
        
        public ActionResult ClienteReniec(ValidaClienteModels model, string returnUrl)
        {
            try
            {
                    try
                    {
                        if (model.dni > 0)
                        {

                            SOAPClienteTarjetaService.Cliente proxyCliente = new SOAPClienteTarjetaService.Cliente();
                            SOAPClienteTarjetaService.ClienteTarjetaServiceClient proxyRipley = new SOAPClienteTarjetaService.ClienteTarjetaServiceClient();
                            proxyCliente = proxyRipley.ValidaCliente(model.dni);
                            Session["id"] = proxyCliente.dni;
                            Session["apePat"] = proxyCliente.apellidoPaterno;
                            Session["apeMat"] = proxyCliente.apellidoMaterno;
                            Session["Nombres"] = proxyCliente.nombres;
                            Session["direccion"] = proxyCliente.direccion;
                            Session["LineaCredito"] = proxyCliente.lineaCredito;
                            Session["Tarjeta"] = proxyCliente.tarjeta;
                            return RedirectToAction("ReniecOK", "Cliente", model);
                        }
                    }
                    catch (Exception ex)
                    {
                        Session["Mensaje"] = ex.Message.ToString();
                        return RedirectToAction("ReniecKO", "Cliente",model);
                    }
                    
            }
            catch (WebException ex)
            {
                ModelState.AddModelError("", ex.Message.ToString());
            }
            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            return View(model);
        }
        public ActionResult Index()
        {
            return View();
        }


        //
        // GET: /Cliente/Details/5
        [HttpPost]
        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Cliente/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Cliente/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        
        //
        // GET: /Cliente/Edit/5
 
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: /Cliente/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Cliente/Delete/5
        
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /Cliente/Delete/5

        [HttpPost]       
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}
